#include "uart_msg_queue.h"
#include <stdio.h>

/*********************************************************************
 * @fn      UART_MSG_Queue_Init
 *
 * @brief   串口消息队列头结点初始化
 *
 * @param   none
 *
 * @return  初始化串口消息队列头节点
 */
UART_MSG_Queue_Header *UART_MSG_Queue_Init(void)
{
	UART_MSG_Queue_Header *queue = (UART_MSG_Queue_Header *)malloc(sizeof(UART_MSG_Queue_Header));
	queue->Queue_Head            = NULL;
	queue->Queue_Trial           = NULL;

	return queue;
}

/*********************************************************************
 * @fn      UART_MSG_Queue_Enqueue
 *
 * @brief   串口消息队列入队操作
 *
 * @param   q:头结点  msg:串口消息数据包
 *
 * @return  none
 */
void UART_MSG_Queue_Enqueue(UART_MSG_Queue_Header *q, uartmsg msg)
{
	UART_MSG_Queue_Node *node;

	int i;

	if(q!=NULL)
	{
		node           = (UART_MSG_Queue_Node *)malloc(sizeof(UART_MSG_Queue_Node));
		node->uart_msg = msg;
		node->next     = NULL;

		//第一次插入
		if(q->Queue_Head==NULL)
		{
			q->Queue_Head  = node;
			q->Queue_Trial = node;
		}
		else//尾插法
		{
			q->Queue_Trial->next = node;//原来尾部指针的下一个节点指向node
			q->Queue_Trial       = node;//将尾部指针指向node
		}
	}
}

/*********************************************************************
 * @fn      UART_MSG_Queue_Dequeue
 *
 * @brief   串口消息队列出队操作
 *
 * @param   q:头结点
 *
 * @return  返回队首节点
 */
UART_MSG_Queue_Node *UART_MSG_Queue_Dequeue(UART_MSG_Queue_Header *q)
{
	UART_MSG_Queue_Node *node=NULL;

	if(q!=NULL&&q->Queue_Head!=NULL)
	{
		node          = q->Queue_Head;//保存首个节点
		q->Queue_Head = node->next;//更新头部位置
	}

	return node;
}
